1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : news/classes/class.NewsCategory.inc.php
5 : - Modulgruppe: News
6 : - Beschreibung: Oberklasse der News-Kategorien.
7 : - Version: 0.1, 09/01/08
8 : - Autor(en): Corinna Kropf <corinna.kropf@mni.fh-giessen.de>
9 : +---------------------------------------------------------------------------+
10 : This program is free software; you can redistribute it and/or
11 : modify it under the terms of the GNU General Public License
12 : as published by the Free Software Foundation; either version 2
13 : of the License, or any later version.
14 : +---------------------------------------------------------------------------+
15 : This program is distributed in the hope that it will be useful,
16 : but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : GNU General Public License for more details.
19 : You should have received a copy of the GNU General Public License
20 : along with this program; if not, write to the Free Software
21 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 : +--------------------------------------------------------------------------*/
23 :
24 1 : require_once ("class.bbcode.inc.php");
25 1 : require_once ("class.Course.inc.php");
26 :
27 :
28 : /**
29 : * Abstrakte Oberklasse der News-Kategorien
30 : */
31 : abstract class NewsCategory
32 1 : {
33 : /**
34 : * Query Cache zur Minimierung von DB Abfragen (Performance Tweak)
35 : * @var int
36 : */
37 : protected $queryCacheObject;
38 : /**
39 : * Kategorie-ID
40 : * @var int
41 : */
42 : protected $myCategory;
43 : /**
44 : * News der jeweiligen Kategorie
45 : * @var array
46 : */
47 : protected $news;
48 : /**
49 : * Liste der User-IDs
50 : * @var array
51 : */
52 : protected $courses;
53 : /**
54 : * Kurs-Einstellungen
55 : * @var array
56 : */
57 : protected $coursePreferences;
58 : /**
59 : * Kurs-Einstellungen
60 : * @var array
61 : */
62 : protected $users;
63 : /**
64 : * BBCode-Parser-Objekt zum Entfernen von BBCode-Tags
65 : * @var object
66 : */
67 : protected $bbcode;
68 :
69 : /**
70 : * Zend_Translate - Objekt
71 : */
72 : protected $translate;
73 :
74 : /**
75 : * Zend_Locale - Objekt
76 : */
77 : protected $locale;
78 :
79 : /**
80 : * Vorletzter Besuch der Kategorie
81 : *
82 : * @var int
83 : */
84 : private $secondlastvisit;
85 :
86 : /**
87 : * Konstruktor
88 : * Klasse soll nicht direkt instantiiert werden koennen
89 : *
90 : * @param $catID int ID der News-Kategorie
91 : * @param $courses array Liste der Kurse, fuer die die News anzuzeigen sind
92 : */
93 :
94 : /**
95 : * @var Category
96 : */
97 : protected $categorySettings;
98 :
99 : protected function __construct($catID, $courses = null, $category = null)
100 : {
101 0 : $this->locale = getLocale();
102 0 : $this->translate = getTranslate("news");
103 0 : $this->queryCacheObject = null;
104 :
105 0 : $this->myCategory = $catID;
106 0 : $this->courses = $courses;
107 0 : $this->news = null;
108 0 : $this->bbcode = new BBCode();
109 0 : $this->secondlastvisit = 0;
110 0 : $this->categorySettings = $category;
111 0 : }
112 : /**
113 : * Gibt die ID der Kategorie zurück (wird im Konstruktor übergeben)
114 : *
115 : * @access return int Kategorie-ID
116 : */
117 : public function getCategory()
118 : {
119 0 : return $this->myCategory;
120 : }
121 : /**
122 : * Funktion zum Setzen der Kurs-Einstellungen fuer die jeweilige Kategorie
123 : *
124 : * @param $preferences array
125 : */
126 : public function setCoursePreferences($preferences)
127 : {
128 0 : $this->coursePreferences = $preferences;
129 0 : }
130 : /**
131 : * Überprüft, ob das Modul im jeweiligen Kurs installiert ist.
132 : * Muss von jeder Unterklasse implementiert werden.
133 : *
134 : * @param $courseID int aktuell behandelter Kurs
135 : * @return bool true wenn Modul installiert, false sonst
136 : */
137 : public abstract function isInstalled($courseID);
138 : /**
139 : * Muss von jeder Unterklasse implementiert werden.
140 : *
141 : * @return bool true, wenn diese Kategorie nach Zeitintervall gefiltert werden kann, false sonst
142 : */
143 : public abstract function canSelectPeriod();
144 : /**
145 : * Erzeugt die passende Ueberschrift. Muss von jeder Unterklasse implementiert werden.
146 : *
147 : * @param $courseID int ID des Kurses
148 : * @param $type String Unterscheidung zwischen course und ecom
149 : * @return string Ueberschrift für die News-Kategorie
150 : */
151 : public abstract function getNewsHeaderTitle($courseID = null, $type = null);
152 :
153 : /**
154 : * Methoden zum Ermitteln der News.
155 : *
156 : * @param int $courseID int ID des Kurses
157 : * @param int $lastvisit Timestamp des letzten Besuches dieses Users im Portal
158 : * @param int $usergroup ID der Benutzergruppe (default null)
159 : * @param array $queryCacheObject Query cache zur Minimierung von DB Abfragen
160 : * @return mixed Array mit den News, wenn vorhanden, null sonst
161 : */
162 : public function getNews($courseID, $lastvisit, $usergroup = null) {
163 0 : $from = $lastvisit;
164 0 : $to = time();
165 :
166 0 : return $this->getNewsByPeriod($courseID, $from, $to, $lastvisit, $usergroup);
167 : }
168 :
169 : public function hasNews($courseID) {
170 0 : return $this->isInstalled($courseID) && (! empty($this->news["data"]) || isset($_GET['showAll']));
171 : }
172 :
173 : /**
174 : * Methoden zum Ermitteln der verpassten News.
175 : *
176 : * @param int $courseID int ID des Kurses
177 : * @param int $lastvisit Timestamp des letzten Besuches dieses Users im Portal
178 : * @param int $usergroup ID der Benutzergruppe (default null)
179 : * @param array $queryCacheObject Query cache zur Minimierung von DB Abfragen
180 : * @return mixed Array mit den News, wenn vorhanden, null sonst
181 : **/
182 : public function getMissedNews($courseID, $lastvisit, $usergroup = null) {
183 0 : if (!$this->canSelectPeriod()) {
184 0 : return null;
185 : }
186 :
187 0 : global $db;
188 0 : $from = $this->secondlastvisit;
189 0 : $to = $lastvisit;
190 :
191 : /* Zeitpunkt noch nicht gesetzt -> ermitteln */
192 0 : if ($from == 0) {
193 : /* Nicht ausgeloggt: lastlogout->lastlogin2 (lastvisit==lastlogin2) */
194 0 : if (isset($_SESSION['loggedout']) && !$_SESSION['loggedout']) {
195 0 : $query = "SELECT lastlogout FROM user WHERE ID='".$_SESSION["userid"]."'";
196 0 : $result = $db->get_row($query, ARRAY_A);
197 0 : $from = $result['lastlogout'];
198 : /* Ausgeloggt: lastlogin2->lastlogout (lastvisit==lastlogout) */
199 0 : } else {
200 0 : $query = "SELECT lastlogin2 FROM user WHERE ID='".$_SESSION["userid"]."'";
201 0 : $result = $db->get_row($query, ARRAY_A);
202 0 : $from = $result['lastlogin2'];
203 : }
204 :
205 0 : $this->secondlastvisit = $from;
206 0 : }
207 :
208 0 : return $this->getNewsByPeriod($courseID, $from, $to, $lastvisit, $usergroup);
209 : }
210 :
211 : /**
212 : * Methode zum Ermitteln der News nach Zeitintervall. Muss von jeder Unterklasse implementiert werden.
213 : *
214 : * @param $courseID int ID des Kurses
215 : * @param $lastvisit int Timestamp des letzten Besuches dieses Users im Portal
216 : * @param $usergroup int ID der Benutzergruppe (default null)
217 : * @return mixed Array mit den News, wenn vorhanden, null sonst
218 : */
219 : protected abstract function getNewsByPeriod($courseID, $from, $to, $lastvisit, $usergroup = null);
220 :
221 : /**
222 : * Ausgabe des Tabellenkopfes einer Kategorie mit Anzahl der News, Titel, Menue etc.
223 : *
224 : * @param $courseID int aktuell behandelter Kurs
225 : * @param $type String course oder ecom
226 : * @param $category int Newskategorie
227 : */
228 : public function echoNewsTableHead($courseID, $type = null) {
229 :
230 0 : if(!isset($courseID)) return;
231 0 : if(!is_numeric($courseID)) return;
232 0 : if(!$this->hasNews($courseID)) return;
233 :
234 0 : $showPeriodSelector = $this->canSelectPeriod();
235 0 : $title = $this->getNewsHeaderTitle($courseID, $type);
236 0 : $category = $this->myCategory;
237 :
238 0 : $color = "";
239 0 : if ($this->categorySettings->getColor() != "") {
240 0 : $textColor = ($this->categorySettings->hasDarkColor()) ? "white" : "black";
241 0 : $color = "style='background-color: #" . $this->categorySettings->getColor() . "; color: $textColor;'";
242 0 : }
243 :
244 0 : echo "<table class='newsCatBlock' cellspacing='0' id='category$courseID$category'>\n";
245 0 : if ($showPeriodSelector && isset($this->coursePreferences)) {
246 0 : $periodSelectIcon = PATH_TO_ROOT."images/arrow_r.gif";
247 0 : $selectablePeriods = array(LASTVISIT, 1, 2, 3, 5, 7, 10, 14, 21, 28);
248 0 : if ($courseID > 0) { // Nur in Kursen, nicht im Foyer
249 0 : $selectablePeriods[] = COURSESTART;
250 0 : }
251 0 : if ($courseID == 0) { // Nur im Foyer
252 0 : $selectablePeriods[] = REGDATE;
253 0 : }
254 0 : $periodSelections = "";
255 0 : foreach($selectablePeriods as $period) {
256 0 : $selected = ($this->coursePreferences == $period)? " selected='selected'" : "";
257 : switch($period) {
258 0 : case LASTVISIT:
259 0 : $timeToDisplay = $this->translate->_("Seit dem letzten Besuch");
260 0 : break;
261 0 : case 1:
262 0 : $timeToDisplay = $this->translate->_("Letzte 24 Stunden");
263 0 : break;
264 0 : case COURSESTART:
265 0 : $timeToDisplay = $this->translate->_("Seit Kursbeginn");
266 0 : break;
267 0 : case REGDATE:
268 0 : $timeToDisplay = $this->translate->_("Seit Portalanmeldung");
269 0 : break;
270 0 : default:
271 0 : $timeToDisplay = ($period > 14)? sprintf($this->translate->_("Letzte %1\$s Wochen"), ceil($period/7) ) : sprintf($this->translate->_("Letzte %1\$s Tage"), $period );
272 0 : break;
273 0 : }
274 0 : $periodSelections .= "<option value='".$period."'".$selected.">".$timeToDisplay."</option>\n";
275 0 : }
276 0 : $showAll = isset($_GET['showAll']) ? "?showAll=42" : "";
277 0 : $newsTableHead = new Template(PATH_TO_ROOT."news/templates/newstablehead_select.html");
278 :
279 0 : $g_Zeitraumwaehlen = $this->translate->_("Zeitraum wählen");
280 :
281 0 : eval($newsTableHead->GetTemplate());
282 0 : }
283 : else {
284 0 : echo "<tr><td class='newsCatBlockHeader' $color>".$title."</td></tr>\n";
285 : }
286 :
287 0 : echo "<tr><td class='newsCatBlockContent'>\n";
288 0 : }
289 : /**
290 : * Methode zum Ausgeben eines News-Eintrages. Muss von jeder Unterklasse implementiert werden.
291 : *
292 : * @param $entry array Einzelner Newseintrag
293 : * @param $courseID int ID des Kurses
294 : * @param $usergroup int ID der Benutzergruppe (default null)
295 : */
296 : protected abstract function echoNewsEntry($entry, $courseID, $usergroup = null);
297 : /**
298 : * Methode zum Ausgeben der News.
299 : *
300 : * @access public
301 : * @param $courseID int ID des Kurses
302 : * @param $usergroup int ID der Benutzergruppe (default null)
303 : */
304 : public function echoNews($courseID, $usergroup = null)
305 : {
306 0 : if (isset($this->news) && !empty($this->news) && isset($this->news["data"]))
307 0 : {
308 0 : $this->getUserInfos();
309 0 : foreach($this->news["data"] as $entry) {
310 0 : $this->echoNewsEntry($entry, $courseID, $usergroup);
311 0 : }
312 0 : }
313 0 : }
314 :
315 : /**
316 : * Methode zum Ermitteln der User-IDs zu den News-Eintraegen.
317 : * Diese werden benoetigt, wenn ein Link zu einem User angezeigt werden soll.
318 : */
319 : protected function getUserInfos() {
320 0 : if (isset($this->users) && count($this->users) > 0) {
321 0 : global $db;
322 0 : $user = array_map("intval", array_values($this->users));
323 0 : $user = $db->get_results("SELECT ID, Vorname, Nachname, Usergroup, gender FROM user WHERE ID IN (".implode(",", $user) .")", ARRAY_A);
324 0 : $this->news["user"] = Utilities::setArrayIndexes($user, "ID");
325 0 : }
326 0 : }
327 : /**
328 : * Rückgabe eines Timestamps, der mit dem Anzeigezeitraum (in Tagen) bestimmt wird
329 : *
330 : * @param $courseID int ID des aktuell behandelten Kurses
331 : * @return $lastvisit int Timestamp des letzten Besuch des Users
332 : */
333 : protected function getPeriod($courseID, $lastvisit) {
334 0 : switch ($this->coursePreferences) {
335 0 : case LASTVISIT:
336 0 : return $lastvisit;
337 0 : case COURSESTART:
338 0 : return strtotime($this->courses[$courseID]["OpenDate"]);
339 0 : case REGDATE:
340 0 : return strtotime($this->courses[0]["OpenDate"]);
341 0 : default:
342 0 : return time() -($this->coursePreferences*24*3600); // - ((int) date("H") * 3600) - ((int) date("i") * 60) - ((int) date("s"));
343 0 : }
344 : }
345 : /**
346 : * Gibt den mit dem Profil verlinkten Namen eines Users zurück
347 : * oder den Text "User nicht mehr registriert."
348 : *
349 : * @param $user array Array mit den Benutzerdaten
350 : * @param $userID int User-ID
351 : * @return string Profil-Link oder kursiver Text "User nicht mehr
352 : * registriert."
353 : */
354 : protected function getProfileLink($user, $userID, $courseID) {
355 0 : if ($userID != 3 && isset($user[$userID])) {
356 0 : $changeCourse = "";
357 0 : if ($courseID && $courseID != $_SESSION["course"]) $changeCourse = "&changeToCourse=$courseID";
358 0 : return "<a title=\"Zum Profil von ".Data::toHTML($user[$userID]["Vorname"]." ".$user[$userID]["Nachname"], false) ."\" "."href='".PATH_TO_ROOT."user/homepage.php?user=$userID$changeCourse'>".Data::toHTML($user[$userID]["Nachname"].", ".$user[$userID]["Vorname"], false) ."</a>";
359 : } else {
360 : return "<span style='font-style:italic;font-weight:normal'>"
361 0 : . $this->translate->_("User nicht mehr registriert")
362 0 : . "</span>";
363 : }
364 : }
365 :
366 : public function getUsers() {
367 0 : return $this->users;
368 : }
369 : }
|